package com.github.rojanu.contact.rest.resource; import com.codahale.metrics.annotation.Timed; import com.github.kristofa.brave.ServerTracer; import com.github.rojanu.client.CloseableClient; import com.github.rojanu.config.client.ClientConfig; import com.github.rojanu.contact.api.ContactService; import com.github.rojanu.contact.api.model.Contact; import com.github.rojanu.contact.client.ContactClientFactory; import com.github.rojanu.contact.rest.core.ExampleResponse; import com.github.rojanu.contact.rest.model.RestContactRequest; import com.twitter.util.Await; import com.twitter.util.Future; import java.util.List; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; @Path("/contact") @Produces(MediaType.APPLICATION_JSON) public class ContactResource { private CloseableClient<ContactService> client; private final ServerTracer serverTracer; public ContactResource(ClientConfig clientConfig, ServerTracer serverTracer) { client = new ContactClientFactory(clientConfig).getClient("contact-client"); this.serverTracer = serverTracer; } @POST @Timed public Response addContact(RestContactRequest restContactRequest) { serverTracer.submitAnnotation("Adding Contact"); try { Future<Contact> contactFuture = client.get().create(RestContactRequest.to(restContactRequest)); Contact contact = Await.result(contactFuture); return Response.ok(contact).build(); } catch (Exception e) { e.printStackTrace(); return Response.status(Response.Status.NOT_FOUND).entity( new ExampleResponse( ContactService.ERROR_CODE_CONTACT_NOT_FOUND, e.getMessage() ) ).build(); } } @GET @Timed @Path("/{id}") public Response getContact(@PathParam("id") String id) { try { Future<Contact> contactFuture = client.get().get(id); Contact contact = Await.result(contactFuture); return Response.ok(contact).build(); } catch (Exception e) { return Response.status(Response.Status.NOT_FOUND).entity( new ExampleResponse( ContactService.ERROR_CODE_CONTACT_NOT_FOUND, e.getMessage() ) ).build(); } } @GET @Timed public Response getContact() { try { Future<List<Contact>> contactFuture = client.get().getAll(); List<Contact> contacts = Await.result(contactFuture); return Response.ok(contacts).build(); } catch (Exception e) { return Response.status(Response.Status.NOT_FOUND).entity( new ExampleResponse( ContactService.ERROR_CODE_CONTACT_NOT_FOUND, e.getMessage() ) ).build(); } } @DELETE @Timed @Path("/{id}") public Response deleteContact(@PathParam("id") String id) { try { Future<String> contactFuture = client.get().delete(id); Await.result(contactFuture); return Response.ok().build(); } catch (Exception e) { return Response.status(Response.Status.NOT_FOUND).entity( new ExampleResponse( ContactService.ERROR_CODE_CONTACT_NOT_FOUND, e.getMessage() ) ).build(); } } @PUT @Timed @Path("/{id}") public Response updateContact(@PathParam("id") String id, RestContactRequest restContactRequest) { try { Future<Contact> contactFuture = client.get().update(id, RestContactRequest.to(restContactRequest)); Contact updateContact = Await.result(contactFuture); return Response.ok(updateContact).build(); } catch (Exception e) { return Response.status(Response.Status.NOT_FOUND).entity( new ExampleResponse( ContactService.ERROR_CODE_CONTACT_NOT_FOUND, e.getMessage() ) ).build(); } } }